﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;

using WebShopAPI.Models;

namespace WebShopAPI.Filter
{
    /// <summary>
    /// JWT授权过滤器
    /// AuthorizeAttribute 该类定义两个基类方法，一个用于验证
    /// 可以转向定义，检查该过滤器 提供处理方法
    /// </summary>
    public class JWTAuthorizeAttribute : AuthorizeAttribute // web api中过滤器 引用system.web.http 不是 mvc的
    {
        //授权验证：为true通过授权，false末通过
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            //找传过header为什么的
            var authHeader = from t in actionContext.Request.Headers
                             where t.Key == "Authorization" //名字与前台对应
                             select t.Value.FirstOrDefault();
            if (authHeader != null)
            {
                string token = authHeader.FirstOrDefault();
                if (!string.IsNullOrEmpty(token))
                {
                    try
                    {
                        var json = JWTHelp.ValidateJwtToken(token,"123");//123 要与加密的部分一致

                        if (json != null)
                        {
                            //把获取到数据通过路由机制：从过滤器，转到 控制器，控件器就可以获取到
                            actionContext.RequestContext.RouteData.Values.Add("Authorization", json);
                            return true;
                        }
                        return false;
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                }
            }
            return false;
        }

        //末授权通过如何处理
        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
        {
            actionContext.Response = actionContext.Request.CreateResponse(
              HttpStatusCode.Forbidden,
              new ResponData
              {
                  data = null,
                  meta = new Meta
                  {
                      msg = "服务端拒绝访问：您没有访问权限，或者掉线了",
                      status = 500 //
                  }

              });
           // base.HandleUnauthorizedRequest(actionContext);
        }
    }
}